package edu.kufpg.armatus.gesture; import edu.kufpg.armatus.R; import android.app.Activity; import android.view.Gravity; import android.view.LayoutInflater; import android.view.ScaleGestureDetector; import android.view.View; import android.view.ViewGroup; import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener; import android.widget.PopupWindow; import android.widget.TextView; public class OnPinchZoomListener extends SimpleOnScaleGestureListener { public final static int DEFAULT_SIZE = 20; public final static int DEFAULT_MIN_SIZE = 15; public final static int DEFAULT_MAX_SIZE = 60; private Activity mActivity; private PopupWindow mPopup; private View mPopupView; private TextView mPopupTextView; private int mIntSize; private float mFloatSize; private int mMinSize; private int mMaxSize; public OnPinchZoomListener(Activity activity) { this(activity, DEFAULT_SIZE, DEFAULT_MIN_SIZE, DEFAULT_MAX_SIZE); } public OnPinchZoomListener(Activity activity, int size) { this(activity, size, DEFAULT_MIN_SIZE, DEFAULT_MAX_SIZE); } public OnPinchZoomListener(Activity activity, int size, int minSize, int maxSize) { mActivity = activity; if (size < minSize || size > maxSize) { throw new IllegalArgumentException("size (" + size + ") is not between minSize (" + minSize + ") and maxSize (" + maxSize + ')'); } mIntSize = size; mFloatSize = size; mMinSize = minSize; mMaxSize = maxSize; LayoutInflater inf = LayoutInflater.from(activity); mPopupView = inf.inflate(R.layout.popup, (ViewGroup) activity.findViewById(R.id.popup_layout)); mPopupView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); mPopupTextView = (TextView) mPopupView.findViewById(R.id.popup_textview); refreshPopup(size); mPopup = new PopupWindow(mPopupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, false); } @Override public boolean onScale(ScaleGestureDetector detector) { float size = mFloatSize; float factor = detector.getScaleFactor(); float product = size*factor; product = Math.max(mMinSize, Math.min(product, mMaxSize)); refreshPopup((int) product); mFloatSize = product; return true; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { mPopup.showAtLocation(mPopupView, Gravity.CENTER, 0, 0); return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { mPopup.dismiss(); } public int getIntSize() { return mIntSize; } public float getFloatSize() { return mFloatSize; } public void setSize(int newSize) { mFloatSize = newSize; refreshPopup(newSize); } private void refreshPopup(int newFontSize) { mIntSize = newFontSize; String label = mActivity.getResources().getString(R.string.popup_text); mPopupTextView.setText(label + ' ' + newFontSize); } }